package com.bdqn.design.proxy;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;

/**
 * IntermediarySubclass 中介（继承式）
 *
 * @author LILIBO
 * @since 2025/1/8
 */
public class IntermediarySubclass extends RealBuyer {

    /**
     * 日志
     */
    private final Logger log = LogManager.getLogger(IntermediarySubclass.class);

    /**
     * 重写父类的看房方法
     *
     * @return
     */
    @Override
    public String havealook() {
        // 环绕增强，全权代理目标方法
        return surround();
    }

    /**
     * 环绕增强
     */
    private String surround() {
        log.info("【环绕增强】全权代理目标方法");
        // 【前置增强】在客户看房之前做一些准备
        before();

        String idea = null;
        try {
            // 让服务目标（真实买房者）实地考察
            // idea = "很好很好。。。（假装看了房）";
            idea = super.havealook();

            // 【后置增强】在客户看房之后做一些整理
            after();
        } catch (RuntimeException e) {
            abnormal(e);
        } finally {
            end();
        }
        return idea;
    }

    /**
     * 前置增强
     */
    private void before() {
        log.info("【前置增强】在调用目标方法之前做的增强");
        log.info("① 前期准备");
        log.info("② 查找房源");
        log.info("③ 和卖家沟通时间");
    }

    /**
     * 后置增强
     */
    private void after() {
        log.info("【后置增强】在调用目标方法之后做的增强");
        log.info("④ 后期跟踪");
        log.info("⑤ 和买家沟通意见");
    }

    /**
     * 异常增强
     */
    private void abnormal(Exception e) {
        log.info("【异常增强】在调用目标方法发生异常时做的增强");
        log.error("发生了异常：" + e.getMessage());
    }

    /**
     * 最终增强
     */
    private void end() {
        log.info("【最终增强】无论如何都会执行的增强");
        log.info("记录本次交易！");
    }

}
